const fs = require('fs');
const Koa = require('koa');
const KoaRouter = require('koa-router');
const koaBodyParser = require('koa-bodyparser');
const query = require('./mysqlAsync');

const app = new Koa();
const router = new KoaRouter();

// 应用解析请求体的中间件
app.use(koaBodyParser());

// 编写中间件
app.use(async (ctx, next) => {
    const start = Date.now();
    await next();
    const end = Date.now();
    fs.appendFileSync(
        './info.log',
        `请求方式：${ctx.method}, 请求地址：${ctx.path}, 响应状态码：${
            ctx.status
        }, 请求耗时：${end - start}ms\n`
    );
});

// 定义接口
router.post('/users', async (ctx) => {
    // 解析请求体
    const { username, password, email = '' } = ctx.request.body;
    // 非空校验
    if (!username || !password) {
        ctx.body = {
            code: 400,
            message: '参数有误',
        };
        return;
    }
    // 如果有邮箱，就校验邮箱格式 53180@qq.com
    if (email && !/^[\w]+@[\w]+\.com/.test(email)) {
        ctx.body = {
            code: 400,
            message: '邮箱格式有误',
        };
        return;
    }
    // 该用户是不是已经在数据库中存在了
    let res = await query(`select * from user where username = '${username}'`);
    // 用户存在，不可以创建
    if (res.length !== 0) {
        ctx.body = {
            code: 403,
            message: '用户已存在，不允许重复创建',
        };
        return;
    }
    // 添加用户信息到数据库
    res = await query(
        `insert into user (username, password, email) values ('${username}', '${password}', '${email}')`
    );

    // 添加成功
    if (res.affectedRows === 1) {
        ctx.body = {
            code: 201,
            message: '添加成功',
        };
    }
});

// 查询接口
router.get('/users', async (ctx) => {
    // 接收参数
    let { pagenum, pagesize } = ctx.query;
    if (isNaN(pagenum) || isNaN(pagesize)) {
        ctx.body = {
            code: 400,
            message: '分页参数不合法',
        };
        return;
    }
    // 格式化成数字
    pagenum = Number(pagenum);
    pagesize = Number(pagesize);
    // 分页起始脚标
    let startIndex = (pagenum - 1) * pagesize;
    // 查询数据库，获取用户列表数据
    const list = await query(
        `select * from user limit ${startIndex}, ${pagesize}`
    );
    // 获取总条数
    const totalArr = await query(`select count(*) as total from user`);
    total = totalArr[0].total;
    // 返回响应
    ctx.body = {
        code: 200,
        data: {
            list,
            total,
        },
        message: '请求成功',
    };
});

// 修改接口
router.put('/users/:id', async (ctx) => {
    // 获取路径参数
    const { id } = ctx.params;

    // 获取请求参数
    const { password, email } = ctx.request.body;

    console.log(id, ctx.request.body);

    // 查询有没有这个要修改的用户
    let res = await query(`select * from user where id = ${id}`);

    // 用户不存在
    if (res.length === 0) {
        ctx.body = {
            code: 404,
            message: '用户不存在',
        };
        return;
    }

    // 拿到数据库中的用户
    const userFromDB = res[0];

    if (password) {
        userFromDB.password = password;
    }

    if (email) {
        // 校验邮箱
        if (!/^[\w\d]+@[\w]+\.com/.test(email)) {
            ctx.body = {
                code: 400,
                message: '邮箱格式不正确',
            };
            return;
        }

        userFromDB.email = email;
    }

    // 修改用户信息
    res = await query(
        `update user set password = '${userFromDB.password}', email = '${userFromDB.email}' where id = ${id}`
    );

    // 查看结果
    if (res.affectedRows === 1) {
        ctx.body = {
            code: 200,
            message: '修改成功',
        };
    }
});

// 删除接口
router.delete('/users/:id', async (ctx) => {
    // 接收路径参数
    const { id } = ctx.params;
    // 删除
    await query(`delete from user where id = ${id}`);
    // 响应成功
    ctx.body = {
        code: 204,
        message: '删除成功',
    };
});

// 挂载路由
app.use(router.routes());

app.listen(8000, () => {
    console.log('Server running at http://localhost:8000');
});
